package com.yc.sole.erp.biz;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import com.yc.sole.erp.dto.BomDto;
import com.yc.sole.erp.dto.MaterialDto;
import com.yc.sole.erp.repository.BomRepository;
import com.yc.sole.erp.repository.MaterialRepository;
import com.yc.sole.erp.request.BomQueryReq;
import com.yc.sole.erp.request.BomReq;
import com.yc.sole.erp.response.BomResp;
import com.yc.sole.framework.mybatis.page.Paging;
import com.yc.sole.framework.mybatis.util.PageUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.*;
import java.util.stream.Collectors;

/**
 * 服务接口实现
 *
 * @author yizuomin
 * @date 2024-01-24
 **/
@Slf4j
@Service
@RequiredArgsConstructor
public class BomBiz {

    private final BomRepository bomRepository;
    private final MaterialRepository materialRepository;

    /**
     * 新增
     *
     * @param bomReq
     */
    @Transactional(rollbackFor = Exception.class)
    public void saveBom(BomReq bomReq) {
        BomDto dto = new BomDto();
        BeanUtil.copyProperties(bomReq, dto);
        bomRepository.saveBom(dto);
    }

    /**
     * 修改
     *
     * @param bomReq
     */
    @Transactional(rollbackFor = Exception.class)
    public void updateBomById(BomReq bomReq) {
        BomDto dto = new BomDto();
        BeanUtil.copyProperties(bomReq, dto);
        bomRepository.updateBomById(dto);
    }

    /**
     * 通过id批量删除
     *
     * @param ids
     */
    @Transactional(rollbackFor = Exception.class)
    public void deleteBomByIds(Collection<Long> ids) {
        bomRepository.deleteBomByIds(ids);
    }

    /**
     * 根据id查询
     *
     * @param id
     * @return
     */
    public BomResp selectBomById(Long id) {
        BomResp bomResp = BeanUtil.copyProperties(bomRepository.selectBomById(id), BomResp.class);
        if (Objects.isNull(bomResp)) {
            return bomResp;
        }
        MaterialDto materialDto = materialRepository.selectMaterialById(bomResp.getMaterialId());
        bomResp.setMaterialName(materialDto.getName());
        return bomResp;
    }

    /**
     * 分页查询
     *
     * @param page
     * @param bomQueryReq
     * @return
     */
    public Paging<BomResp> selectBomPage(Paging<BomQueryReq> page, BomQueryReq bomQueryReq) {
        Paging<BomDto> paging = bomRepository.selectBomPage(page, bomQueryReq);
        Paging<BomResp> bomRespPaging = PageUtil.pageCopy(paging, BomResp.class);
        List<BomResp> records = bomRespPaging.getRecords();
        if (CollUtil.isEmpty(records)) {
            return bomRespPaging;
        }
        Set<Long> materialIds = records.stream().map(BomResp::getMaterialId).collect(Collectors.toSet());
        Set<Long> productIds = records.stream().map(BomResp::getProductId).collect(Collectors.toSet());

        Map<Long, MaterialDto> materialDtoMap = materialRepository.selectMaterialByIds(materialIds).stream().collect(Collectors.toMap(MaterialDto::getId, v -> v));
        for (BomResp bomResp : records) {
            MaterialDto materialDto = materialDtoMap.get(bomResp.getMaterialId());
            if (Objects.nonNull(materialDto)) {
                bomResp.setMaterialName(materialDto.getName());
            }
        }
        return bomRespPaging;
    }
}
